#include <stdio.h>

// 前置声明
int f(int);
int g(int);

int main() {
    int sum1 = 0, sum2 = 0;
    const int n = 100;

    // 显式映射 sum1 和 sum2 到设备内存
    #pragma omp target data map(sum1, sum2)
    {
        // 第一个目标区域：计算 sum1
        #pragma omp target teams distribute reduction(+:sum1)
        for (int i = 0; i < n; i++) {
            sum1 += f(i);
        }

        // 第二个目标区域：计算 sum2（依赖 sum1）
        #pragma omp target teams distribute reduction(+:sum2)
        for (int i = 0; i < n; i++) {
            sum2 += g(i) * sum1;
        }
    }

    printf("sum1 = %d, sum2 = %d\n", sum1, sum2);
    // OUTPUT: sum1 = 9900, sum2 = 147015000
    return 0;
}

// 函数定义
int f(int res) { return res * 2; }
int g(int res) { return res * 3; }